package com.abner.design.patterns.proxy.cglib;

/**
 * Cglib 代理模式的基本介绍
 *  1) 静态代理和 JDK 代理模式都要求目标对象是实现一个接口,但是有时候目标对象只是一个单独的对象,并没有实
 *     现任何的接口,这个时候可使用目标对象子类来实现代理-这就是 Cglib 代理
 *  2) Cglib 代理也叫作子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能扩展, 有些书也将 Cglib 代理归属到动态代理。
 *  3) Cglib 是一个强大的高性能的代码生成包,它可以在运行期扩展 java 类与实现 java 接口.它广泛的被许多 AOP 的
 *      框架使用,例如 Spring AOP，实现方法拦截
 *  4) 在 AOP 编程中如何选择代理模式：
 *      1. 目标对象需要实现接口，用 JDK 代理
 *      2. 目标对象不需要实现接口，用 Cglib 代理
 *  5) Cglib 包的底层是通过使用字节码处理框架 ASM 来转换字节码并生成新的类
 * @author abner
 */
public class Client {

	public static void main(String[] args) {

		TeacherDao target = new TeacherDao();

		TeacherDao proxyInstance = (TeacherDao)new ProxyFactory(target).getProxyInstance();

		String res = proxyInstance.teach();

		System.out.println("res=" + res);
	}

}
